#include <sqlite3.h>
#include <stdio.h>

/*
	我们使用命名占位符选择汽车的名称和价格
	placeholder: 占位符

	gcc -o named_placeholder named_placeholder.c -lsqlite3
	./named_placeholder
*/


int main(void) {
    
    sqlite3 *db;
    char *err_msg = 0;
    sqlite3_stmt *res;
    
    int rc = sqlite3_open("test.db", &db);
    
    if (rc != SQLITE_OK) {
        
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }
    
    char *sql = "SELECT Id, Name FROM Cars WHERE Id = @id";
        
    rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
    
    if (rc == SQLITE_OK) {

		/*
			int sqlite3_bind_parameter_index(sqlite3_stmt* ppStmt, const char *zName);
              功能：用来获取zName参数名在SQL语句对象中的索引
              参数： 
                     ppStmt ： 指定要操作的SQL语句对象
                     zName： 参数名 
              返回值：
                     成功，返回索引值 >0 
                     没有匹配到参数名，返回0 
		*/
		
        //该函数返回给定名称的 SQL 参数的索引。sqlite3_bind_parameter_index()
        int idx = sqlite3_bind_parameter_index(res, "@id");
        int value = 3;
        sqlite3_bind_int(res, idx, value);
        
    } else {
        
        fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
    }
    
    int step = sqlite3_step(res);
    
    if (step == SQLITE_ROW) {
        
        printf("%s: ", sqlite3_column_text(res, 0));
        printf("%s\n", sqlite3_column_text(res, 1));
        
    } 

    sqlite3_finalize(res);
    sqlite3_close(db);
    
    return 0;
}

